package cn.song.freight.domain.query;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 策略区域定价查询条件对象
 * <pre>
 * 用于策略区域定价信息的条件查询。
 * 支持多种查询维度的组合过滤。
 *
 * 查询维度：
 * - 按策略ID查询
 * - 按区域ID查询
 * - 按状态查询
 * - 按区域名称模糊查询
 * - 按策略名称模糊查询
 *
 * 分页支持：
 * - 继承基础分页参数
 * - 支持排序配置
 *
 * @author SongRenShuo
 * @version 3.0.0
 * @since 2025-08-25
 * </pre>
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "策略区域定价查询条件对象")
public class StrategyAreaPricingQuery {

    /**
     * 策略ID
     */
    @ApiModelProperty(value = "策略ID", example = "1")
    private Long strategyId;

    /**
     * 区域ID
     */
    @ApiModelProperty(value = "区域ID", example = "1")
    private Long areaId;

    /**
     * 状态：1-启用，2-禁用
     */
    @ApiModelProperty(value = "状态：1-启用，2-禁用", example = "1")
    private Integer status;

    /**
     * 策略名称（模糊查询）
     */
    @ApiModelProperty(value = "策略名称（模糊查询）", example = "华东")
    private String strategyName;

    /**
     * 区域名称（模糊查询）
     */
    @ApiModelProperty(value = "区域名称（模糊查询）", example = "北京")
    private String areaName;

    /**
     * 省份名称
     */
    @ApiModelProperty(value = "省份名称", example = "北京市")
    private String provinceName;

    /**
     * 城市名称
     */
    @ApiModelProperty(value = "城市名称", example = "北京市")
    private String cityName;

    /**
     * 区县名称
     */
    @ApiModelProperty(value = "区县名称", example = "朝阳区")
    private String districtName;

    /**
     * 分页页码（从1开始）
     */
    @ApiModelProperty(value = "分页页码（从1开始）", example = "1")
    private Integer pageNum = 1;

    /**
     * 分页大小
     */
    @ApiModelProperty(value = "分页大小", example = "10")
    private Integer pageSize = 10;

    /**
     * 排序字段
     */
    @ApiModelProperty(value = "排序字段", example = "create_time")
    private String orderBy;

    /**
     * 排序方式：asc-升序，desc-降序
     */
    @ApiModelProperty(value = "排序方式：asc-升序，desc-降序", example = "desc")
    private String orderDirection = "desc";

    // ================================
    // 业务方法
    // ================================

    /**
     * 检查是否有查询条件
     * @return true-有条件，false-无条件
     */
    public boolean hasCondition() {
        return strategyId != null
                || areaId != null
                || status != null
                || (strategyName != null && !strategyName.trim().isEmpty())
                || (areaName != null && !areaName.trim().isEmpty())
                || (provinceName != null && !provinceName.trim().isEmpty())
                || (cityName != null && !cityName.trim().isEmpty())
                || (districtName != null && !districtName.trim().isEmpty());
    }

    /**
     * 检查是否为精确策略查询
     * @return true-精确查询，false-模糊查询
     */
    public boolean isExactStrategyQuery() {
        return strategyId != null && strategyId > 0;
    }

    /**
     * 检查是否为精确区域查询
     * @return true-精确查询，false-模糊查询
     */
    public boolean isExactAreaQuery() {
        return areaId != null && areaId > 0;
    }

    /**
     * 设置默认分页参数
     */
    public void setDefaultPagination() {
        if (pageNum == null || pageNum < 1) {
            pageNum = 1;
        }
        if (pageSize == null || pageSize < 1) {
            pageSize = 10;
        }
    }

    /**
     * 设置默认排序
     */
    public void setDefaultOrder() {
        if (orderBy == null || orderBy.trim().isEmpty()) {
            orderBy = "create_time";
        }
        if (orderDirection == null || orderDirection.trim().isEmpty()) {
            orderDirection = "desc";
        }
    }

    /**
     * 获取完整的排序表达式
     * @return 排序表达式
     */
    public String getOrderExpression() {
        setDefaultOrder();
        return orderBy + " " + orderDirection;
    }

    /**
     * 获取查询描述
     * @return 查询描述字符串
     */
    public String getQueryDescription() {
        StringBuilder desc = new StringBuilder("查询条件: ");
        if (strategyId != null) {
            desc.append("策略ID=").append(strategyId).append(" ");
        }
        if (areaId != null) {
            desc.append("区域ID=").append(areaId).append(" ");
        }
        if (status != null) {
            desc.append("状态=").append(status == 1 ? "启用" : "禁用").append(" ");
        }
        if (strategyName != null && !strategyName.trim().isEmpty()) {
            desc.append("策略名称包含'").append(strategyName).append("' ");
        }
        if (areaName != null && !areaName.trim().isEmpty()) {
            desc.append("区域名称包含'").append(areaName).append("' ");
        }
        return desc.toString().trim();
    }
}
